package cn.edu.gdu.quizpractice.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64; // 使用 Bouncy Castle 的 Base64 解码

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.AlgorithmParameters;
import java.security.Security;
// import java.util.Arrays; // Arrays is not used in the current logic

public class WeChatDecryptUtils {

    static {
        // 初始化 BouncyCastle Provider
        // 避免重复添加Provider
        if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
            System.out.println("Adding BouncyCastleProvider...");
            Security.addProvider(new BouncyCastleProvider());
        }
    }

    /**
     * 解密微信小程序用户加密数据
     * @param encryptedDataBase64 Base64编码的加密数据
     * @param sessionKeyBase64 Base64编码的会话密钥 (注意：微信API返回的是原始session_key, 不需要再次解码)
     * @param ivBase64 Base64编码的初始向量
     * @return 解密后的 JSONObject 数据，失败返回 null
     */
    public static JSONObject decryptData(String encryptedDataBase64, String sessionKeyBase64, String ivBase64) {
        try {
            // Base64 解码: encryptedData 和 iv 需要解码, sessionKey 不需要 (微信返回的就是可以直接用的key)
            byte[] encryptedData = Base64.decode(encryptedDataBase64);
            byte[] sessionKey = Base64.decode(sessionKeyBase64); // session_key 本身是 Base64 编码的，需解码后使用
            byte[] iv = Base64.decode(ivBase64);

            // 创建 AES Cipher 实例
            // 算法/模式/补码方式
            // 微信官方文档说明是 AES-128-CBC，PKCS7Padding 是 BouncyCastle 对标准 PKCS5Padding 的别名/实现
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME); 

            // 创建密钥规范和 IV 规范
            SecretKeySpec keySpec = new SecretKeySpec(sessionKey, "AES");
            // IvParameterSpec ivSpec = new IvParameterSpec(iv);
            // AlgorithmParameters 在这里可能不是必须的，可以直接使用 IvParameterSpec
             AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
             params.init(new IvParameterSpec(iv));

            // 初始化 Cipher 为解密模式
            cipher.init(Cipher.DECRYPT_MODE, keySpec, params); // 使用 AlgorithmParameters
            // 或者 cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); // 直接使用 IvParameterSpec

            // 执行解密
            byte[] decrypted = cipher.doFinal(encryptedData);

            // 处理解密结果
            // BouncyCastle 的 PKCS7Padding 会自动处理 Padding
            // 将字节数组转换为 UTF-8 字符串
            String decryptedText = new String(decrypted, StandardCharsets.UTF_8);

            // 解析 JSON 字符串
            return JSON.parseObject(decryptedText);

        } catch (Exception e) {
            // 使用日志框架记录错误会更好
            System.err.println("微信数据解密失败: " + e.getMessage());
            e.printStackTrace(); // 打印详细错误，方便调试
            return null;
        }
    }
} 